%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-
%% ex: ft=erlang ts=4 sw=4 et
[{kernel, 
	[{start_timer, true},
	 {start_pg2, true}
 ]},
 {sasl, [
	{sasl_error_logger, {file, "log/emqttd_sasl.log"}}
 ]},
 {ssl, [
    %{versions, ['tlsv1.2', 'tlsv1.1']}
 ]},
 {lager, [
    {colored, true},
    {async_threshold, 1000},
	{error_logger_redirect, false},
	{crash_log, "log/emqttd_crash.log"},
	{handlers, [
		{lager_console_backend, info},
		{lager_file_backend, [
            {formatter_config, [time, " ", pid, " [",severity,"] ", message, "\n"]},
			{file, "log/emqttd_info.log"},
			{level, info},
			{size, 104857600},
			{date, "$D0"},
			{count, 30}
		]},
		{lager_file_backend, [
            {formatter_config, [time, " ", pid, " [",severity,"] ", message, "\n"]},
			{file, "log/emqttd_error.log"},
			{level, error},
			{size, 104857600},
			{date, "$D0"},
			{count, 30}
		]}
	]}
 ]},
 {esockd, [
    {logger, {lager, info}}
 ]},
 {emqttd, [
    %% Authentication and Authorization
    {access, [
        %% Authetication. Anonymous Default
        {auth, [
            %% Authentication with username, password
            %{username, []},
            
            %% Authentication with clientid
            %{clientid, [{password, no}, {file, "etc/clients.config"}]},

            %% Authentication with LDAP
            % {ldap, [
            %    {servers, ["localhost"]},
            %    {port, 389},
            %    {timeout, 30},
            %    {user_dn, "uid=$u,ou=People,dc=example,dc=com"},
            %    {ssl, fasle},
            %    {sslopts, [
            %        {"certfile", "ssl.crt"},
            %        {"keyfile", "ssl.key"}]}
            % ]},

            %% Allow all
            {anonymous, []}
        ]},
        %% ACL config
        {acl, [
            %% Internal ACL module
            {internal,  [{file, "etc/acl.config"}, {nomatch, allow}]}
        ]}
    ]},
    %% MQTT Protocol Options
    {mqtt, [
        %% Packet
        {packet, [
            %% Max ClientId Length Allowed
            {max_clientid_len, 1024},
            %% Max Packet Size Allowed, 64K default
            {max_packet_size,  65536}
        ]},
        %% Client
        {client, [
            %TODO: Network ingoing limit
            %{ingoing_rate_limit, '64KB/s'}
            %TODO: Reconnet control
        ]},
        %% Session
        {session, [
            %% Expired after 24 hours
            {expires, 24},
            %% Max offline message queue
            {max_queue, 100},
            %% Store Qos0?
            {store_qos0, false}
        ]}
    ]},
    %% Broker Options
    {broker, [
        %% System interval of publishing broker $SYS messages
        {sys_interval, 60},

        %% Retained messages
        {retained, [
            %% Max number of retained messages
            {max_message_num, 100000},
            %% Max Payload Size of retained message
            {max_playload_size, 65536}
        ]},
        %% PubSub
        {pubsub, [
            %% default should be scheduler numbers
            %% {pool_size, 4}
        ]},
        %% Bridge
        {bridge, [
            %%TODO: bridge queue size
            {max_queue_len, 1000},
            %% Ping Interval of bridge node
            {ping_down_interval, 1} %seconds
        ]}
    ]},
    %% Modules
    {modules, [
        %% Client presence management module.
        %% Publish messages when client connected or disconnected
        {presence, [{qos, 0}]},

        %% Subscribe topics automatically when client connected
        {autosub, [{"$Q/client/$c", 0}]}

        %% Rewrite rules
        %% {rewrite, [{file, "etc/rewrite.config"}]}
        
    ]},
    %% Listeners
    {listeners, [
        {mqtt, 1883, [
            %% Size of acceptor pool
            {acceptors, 16},
            %% Maximum number of concurrent clients
            {max_clients, 1024},
            %% Socket Access Control
            {access, [{allow, all}]},
            %% Socket Options
            {sockopts, [
                {backlog, 1024}
                %Set buffer if hight thoughtput
                %{recbuf, 4096},
                %{sndbuf, 4096}
                %{buffer, 4096},
            ]}
        ]},
        {mqtts, 8883, [
            %% Size of acceptor pool
            {acceptors, 4},
            %% Maximum number of concurrent clients
            {max_clients, 1024},
            %% Socket Access Control
            {access, [{allow, all}]},
            %% SSL certificate and key files
            {ssl, [{certfile, "etc/ssl/ssl.crt"},
                   {keyfile,  "etc/ssl/ssl.key"}]},
            %% Socket Options
            {sockopts, [
                {backlog, 1024}
                %{buffer, 4096},
            ]}
        ]},
        %% HTTP and WebSocket Listener
        {http, 8083, [
            %% Size of acceptor pool
            {acceptors, 4},
            %% Maximum number of concurrent clients
            {max_clients, 512},
            %% Socket Access Control
            {access, [{allow, all}]},
            %% Socket Options
            {sockopts, [
                {backlog, 1024}
                %{buffer, 4096},
            ]}
        ]}
    ]}
 ]}
].

